home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / System / BoingBag1 / Contributions / Workbench / ARexx / IconSorter.rexx < prev    next >
OS/2 REXX Batch file  |  1999-12-20  |  8KB  |  346 lines

  1. /*
  2.    $VER: IconSorter.rexx 0.10 (6.11.99) Copyright (c) by Nils Görs
  3.  
  4.  
  5.    This script sorts icons in alphabetical order. It will check for
  6.    Icon weight and height, supports space between icons etc.pp.
  7.  
  8.  
  9. This script needs following arexx-libraries:
  10.     - rexxreqtools.library
  11.     - rexxtricks.library
  12.     - rexxdossupport.library
  13.  
  14.  
  15.    Template: ORDER/M/K,SPACEX/N/K,SPACEY/N/K,SAMEHEIGHT/S,NAMECHECK/S
  16.  
  17.  Parameters: ORDER    = TOOL , DRAWER , PROJECT , GARBAGE , DISK , APPICON
  18.  
  19.          SPACEX    = number of pixel between horizontal icons.
  20.          SPACEY    = number of pixel between vertical icons.
  21.          SAMEHEIGHT = if set all icons will have the same height.
  22.          NAMECHECK    = will check the width of the Iconname and use it.
  23.  
  24.     Example: IconSorter.rexx ORDER=TOOL PROJECT DRAWER SPACEX=20
  25.  
  26.              Will sort the icons in following order: TOOL PROJECT DRAWER         
  27.          The space between two horizontal icons will be 20 pixels.
  28. */
  29.  
  30. spacex = 5            /* x pixel between horizontal icons */
  31. spacey = 3            /* x pixel between vertical icons */
  32.  
  33. posxstart = 18            /* start x position */
  34. posystart = 10            /* start y position */
  35.  
  36. fontheight = 13            /* standard value */
  37.  
  38. SameHeight = "No"        /* If "Yes" the largest icon will be used for position calculation. */
  39. NameCheck  = "No"        /* If "Yes" the width from Iconname will be used. */
  40.  
  41. /* Please do not change anything under this line  */
  42. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  43. NL = '0a'x
  44. options results
  45.  
  46. PARSE ARG input
  47.  
  48. ADDRESS WORKBENCH
  49.  
  50. /* Check workbench.library version */
  51. minversion = "44.1226"
  52. GETATTR APPLICATION.VERSION
  53. wbversion = result
  54. IF wbversion < minversion THEN DO
  55.     call rtezrequest("You are using workbench.library v"||wbversion||NL||"This scripts needs workbench.library v"||minversion||" or higher","_Thanks","IconSorter.rexx",)
  56.     EXIT
  57. END
  58.  
  59. GETATTR OBJECT WINDOWS.ACTIVE
  60. activeWin = result
  61.  
  62. GETATTR OBJECT WINDOW.ICONS.ALL.COUNT NAME '"'||activeWin||'"'
  63. numofIcons = result
  64.  
  65. If numofIcons = 0 THEN EXIT
  66.  
  67. CALL _InitAll
  68.  
  69. /* write all icon informations in a seperate
  70. ** variable and get the max size from an icon.
  71. */
  72. maxiconheight = 0
  73. maxiconwidth = 0
  74.  
  75. do i = 0 to numofIcons-1
  76.     GETATTR OBJECT WINDOW.ICONS.ALL.i NAME '"'||activeWin||'"' STEM IconInfo.i
  77.         IF maxiconheight < IconInfo.i.height THEN maxiconheight = IconInfo.i.height
  78.         IF maxiconwidth < IconInfo.i.width THEN maxiconwidth = IconInfo.i.width
  79.     IF NameCheck = "YES" THEN DO
  80.     GETATTR APPLICATION.FONT.SCREEN.SIZE NAME '"'||IconInfo.i.name||'"'    /* check the wide from iconname */
  81.         IF result > maxiconwidth then maxiconwidth = result
  82.     END
  83. end
  84.  
  85. /* sorting icons */
  86. a = 0    /* AppIcon */
  87. d = 0    /* Drawer */
  88. t = 0    /* Tool */
  89. p = 0    /* Project */
  90. g = 0    /* Garbage */
  91. s = 0    /* Disk */
  92. do i = 0 to numofIcons-1
  93.     SELECT
  94.         WHEN IconInfo.i.type = "DISK" THEN DO
  95.             s = s +1
  96.             DiskVar.s = i
  97.         END
  98.  
  99.         WHEN IconInfo.i.type = "APPICON" THEN DO
  100.             a = a +1
  101.             AppIconVar.a = i
  102.         END
  103.  
  104.         WHEN IconInfo.i.type = "DRAWER" THEN DO
  105.             d = d +1
  106.             drawerVar.d = i
  107.         END
  108.         WHEN IconInfo.i.type = "TOOL" THEN DO
  109.             t = t +1
  110.             toolVar.t = i
  111.         END
  112.         WHEN IconInfo.i.type = "PROJECT" THEN DO
  113.             p = p +1
  114.             projectVar.p = i
  115.         END
  116.  
  117.         WHEN IconInfo.i.type = "GARBAGE" THEN DO
  118.             g = g +1
  119.             garbageVar.g = i
  120.         END
  121.  
  122.     OTHERWISE
  123.         NOP
  124.     END
  125. end
  126.  
  127. DiskVar.0 = s
  128. DrawerVar.0 = d
  129. ToolVar.0 = t
  130. ProjectVar.0 = p
  131. garbageVar.0 = g
  132. AppIconVar.0 = a
  133.  
  134. /* how many icons per row? */
  135. GETATTR OBJECT WINDOW.HEIGHT NAME '"'||activeWin||'"'
  136. winheight = result
  137.  
  138.     iconfont = maxiconheight + fontheight + spacey        /* icon + font height */
  139.     winheight2 = winheight-posystart
  140.  
  141.     IconsPerRow=TRUNC((winheight2/iconfont)-0.5)        /* how many Icons per row? */
  142.  
  143.     IF IconsPerRow <=0 THEN IconsPerRow = 1
  144.  
  145. /*
  146. ** If the user does not specified an sort order,
  147. **  standard-order will be used instead.
  148. */
  149. IF order.count ~= 0 THEN DO
  150.     do o = 0 to order.count-1
  151.             IF order.o = "DISK"    THEN CALL SortDisk
  152.             IF order.o = "APPICON"    THEN CALL SortAppIcon
  153.             IF order.o = "TOOL"    THEN CALL SortTools
  154.             IF order.o = "DRAWER"    THEN CALL SortDrawers
  155.             IF order.o = "PROJECT"    THEN CALL SortProject
  156.             IF order.o = "GARBAGE"    THEN CALL SortGarbage
  157.     end
  158. END
  159.     ELSE DO
  160.         CALL SortDisk
  161.         CALL SortAppIcon
  162.         CALL SortDrawers
  163.         CALL SortTools 
  164.         CALL SortProject
  165.         CALL SortGarbage
  166.     END
  167. IF changes ~= 0 THEN DO        /* any changes to the window? */
  168.     erg=rtezrequest("Resize window?","_Yes|_No","IconSorter.rexx",)
  169.     IF erg = 1 THEN MENU INVOKE WINDOW.RESIZETOFIT
  170.  
  171.     Erg=rtezrequest("Save changes to disk?","_Yes|_No","IconSorter.rexx",)
  172.     IF erg = 1 THEN MENU WINDOW '"'||activeWin||'"' INVOKE WINDOW.SNAPSHOT.ALL
  173. END
  174. EXIT
  175.  
  176. /* subroutines */
  177. SortAppIcon:
  178. IF AppIconVar.0 = 0 THEN RETURN
  179.  
  180. /* create a dump variable <Iconname> <Position> */
  181. do i = 1 to AppIconVar.0
  182.     e = AppIconVar.i
  183.     AppIconVar2.i = IconInfo.e.name e
  184. end
  185. AppIconVar2.0 = AppIconVar.0
  186. CALL RXTR_QSORT(AppIconVar2,sortedvar,NOCASE,,)
  187.  
  188. CALL SetIcons
  189. RETURN
  190.  
  191. SortDisk:
  192. IF Diskvar.0 = 0 THEN RETURN
  193.  
  194. /* create a dump variable <Iconname> <Position> */
  195. do i = 1 to Diskvar.0
  196.     e = Diskvar.i
  197.     Diskvar2.i = IconInfo.e.name e
  198. end
  199. Diskvar2.0 = Diskvar.0
  200. CALL RXTR_QSORT(Diskvar2,sortedvar,NOCASE,,)
  201.  
  202. CALL SetIcons
  203. RETURN
  204.  
  205.  
  206. SortDrawers:
  207. IF drawervar.0 = 0 THEN RETURN
  208.  
  209. /* create a dump variable <Iconname> <Position> */
  210. do i = 1 to drawervar.0
  211.     e = drawervar.i
  212.     drawervar2.i = IconInfo.e.name e
  213.  
  214. end
  215. drawervar2.0 = drawervar.0
  216. CALL RXTR_QSORT(drawervar2,sortedvar,NOCASE,,)
  217.  
  218. CALL SetIcons
  219. RETURN
  220.  
  221. SortTools:
  222. IF toolvar.0 = 0 THEN RETURN
  223.  
  224. /* create a dump variable <Iconname> <Position> */
  225. do i = 1 to toolvar.0
  226.     e = toolvar.i
  227.     toolvar2.i = IconInfo.e.name e
  228. end
  229. toolvar2.0 = toolvar.0
  230. CALL RXTR_QSORT(toolvar2,sortedvar,NOCASE,,)
  231.  
  232. CALL SetIcons
  233. RETURN
  234.  
  235.  
  236. SortProject:
  237. IF Projectvar.0 = 0 THEN RETURN
  238.  
  239. /* create a dump variable <Iconname> <Position> */
  240. do i = 1 to Projectvar.0
  241.     e = Projectvar.i
  242.     Projectvar2.i = IconInfo.e.name e
  243. end
  244. Projectvar2.0 = Projectvar.0
  245. CALL RXTR_QSORT(Projectvar2,sortedvar,NOCASE,,)
  246.  
  247. CALL SetIcons
  248. RETURN
  249.  
  250.  
  251. SortGarbage:
  252. IF Garbagevar.0 = 0 THEN RETURN
  253.  
  254. /* create a dump variable <Iconname> <Position> */
  255. do i = 1 to garbagevar.0
  256.     e = garbagevar.i
  257.     garbagevar2.i = IconInfo.e.name e
  258. end
  259. garbagevar2.0 = garbagevar.0
  260. CALL RXTR_QSORT(garbagevar2,sortedvar,NOCASE,,)
  261.  
  262. CALL SetIcons
  263. RETURN
  264.  
  265. /* This routine is to position all icons */
  266. SetIcons:
  267. LOCKGUI
  268.  
  269. do i = 1 to sortedvar.0
  270.     IF r < IconsPerRow THEN DO
  271.         r = r + 1
  272.         anz=WORDS(sortedvar.i)                /* how man words? <Iconname> <Pos> */
  273.         e = WORD(sortedvar.i,anz)            /* get Index.<Pos> of Icon */
  274.         IconName = SUBWORD(sortedvar.i,1,anz-1)
  275.  
  276.         ICON WINDOW '"'||activeWin||'"' '"'||IconName||'"' X posx Y posy
  277.  
  278.         IF SameHeight = "YES" THEN posY = posY + spaceY + maxiconheight + fontheight
  279.             ELSE DO
  280.                 posy = spacey+posy+IconInfo.e.height+fontheight    /* calculate new position */
  281.                 h = i+1
  282.  
  283.                 IF h > sortedvar.0 THEN NOP
  284.                     ELSE DO
  285.                         anz2=WORDS(sortedvar.h)                /* how man words? <Iconname> <Pos> */
  286.                         f = WORD(sortedvar.h,anz2)            /* get Index.<Pos> of Icon */
  287.                         spaceNeed = posy+spacey+IconInfo.f.height+fontheight
  288.                         IF r = IconsPerRow THEN
  289.                             IF winheight > spaceneed THEN DO
  290.                                 spaceNeed = IconInfo.f.height+fontheight+posystart
  291.                                 IF SpaceNeed+posy < winheight THEN r = r-1
  292.                             END
  293.                     END
  294.             END
  295.     END
  296.     ELSE DO                        /* next ROW */
  297.         i = i - 1
  298.         posy = posystart
  299.         r = 0
  300.         posx = posx + maxiconwidth + spacex
  301.     END
  302. end
  303. UNLOCKGUI
  304. changes = 1
  305. RETURN
  306.  
  307. _InitAll:
  308.  
  309. changes = 0            /* var to check if something changed */
  310. posx = posxstart
  311. posy = posystart
  312. r = 0                /* row counter */
  313.  
  314. Template = "ORDER/M/K,SPACEX/N/K,SPACEY/N/K,SAMEHEIGHT/S,NAMECHECK/S"
  315.  
  316.    /*
  317.    ** Open libs
  318.    */
  319.  
  320.    IF ~SHOW(LIBRARIES,'rexxtricks.library') THEN
  321.       IF ~ADDLIB('rexxtricks.library',9,-30,38) THEN
  322.          quit('Cannot open rexxtricks.library!',10)
  323.  
  324.    IF ~SHOW('LIBRARIES','rexxreqtools.library') THEN
  325.       IF ~ADDLIB('rexxreqtools.library',9,-30,0) THEN
  326.          quit('Cannot open rexxreqtools.library!',10)
  327.  
  328.    IF ~SHOW('LIBRARIES','rexxdossupport.library') THEN
  329.       IF ~ADDLIB('rexxdossupport.library',9,-30,0) THEN
  330.          quit('Cannot open rexxdossupport.library!',10)
  331.  
  332. GETATTR APPLICATION.FONT.SCREEN.HEIGHT
  333. fontheight = result
  334.  
  335.  
  336.     order.count = 0
  337. IF input ~= "" THEN DO
  338.     call ReadArgs(input,Template)
  339.     IF sameheight = 1 THEN SameHeight = "yes"
  340.     IF NameCheck  = 1 THEN NameCheck = "yes"
  341. END
  342. SameHeight = UPPER(SameHeight)
  343. NameCheck= UPPER(NameCheck)
  344. Order= UPPER(order)
  345. RETURN
  346.